plugins {
	id 'io.freefair.aspectj' version '8.4' apply false
	// kotlinVersion is managed in gradle.properties
	id 'org.jetbrains.kotlin.plugin.serialization' version "${kotlinVersion}" apply false
	id 'org.jetbrains.dokka' version '1.9.20'
	id 'org.unbroken-dome.xjc' version '2.0.0' apply false
	id 'com.github.ben-manes.versions' version '0.51.0'
	id 'com.github.johnrengelman.shadow' version '8.1.1' apply false
	id 'de.undercouch.download' version '5.4.0'
	id 'me.champeau.jmh' version '0.7.2' apply false
	id 'me.champeau.mrjar' version '0.1.1'
	id "net.ltgt.errorprone" version "3.1.0" apply false
}

ext {
	moduleProjects = subprojects.findAll { it.name.startsWith("spring-") }
	javaProjects = subprojects.findAll { !it.name.startsWith("framework-") }
}

description = "Spring Framework"

configure(allprojects) { project ->
	apply plugin: "org.springframework.build.localdev"
	group = "org.springframework"
	repositories {
		mavenCentral()
		maven {
			url "https://repo.spring.io/milestone"
			content {
				// Netty 5 optional support
				includeGroup 'io.projectreactor.netty'
			}
		}
		if (version.contains('-')) {
			maven { url "https://repo.spring.io/milestone" }
		}
		if (version.endsWith('-SNAPSHOT')) {
			maven { url "https://repo.spring.io/snapshot" }
		}
	}
	configurations.all {
		resolutionStrategy {
			cacheChangingModulesFor 0, "seconds"
			cacheDynamicVersionsFor 0, "seconds"
		}
	}
}

configure(allprojects - project(":framework-platform")) {
	configurations {
		dependencyManagement {
			canBeConsumed = false
			canBeResolved = false
			visible = false
		}
		matching { it.name.endsWith("Classpath") }.all { it.extendsFrom(dependencyManagement) }
	}
	dependencies {
		dependencyManagement(enforcedPlatform(dependencies.project(path: ":framework-platform")))
	}
}

configure([rootProject] + javaProjects) { project ->
	apply plugin: "java"
	apply plugin: "java-test-fixtures"
	apply plugin: 'org.springframework.build.conventions'
	apply from: "${rootDir}/gradle/toolchains.gradle"
	apply from: "${rootDir}/gradle/ide.gradle"

	dependencies {
		testImplementation("org.junit.jupiter:junit-jupiter-api")
		testImplementation("org.junit.jupiter:junit-jupiter-params")
		testImplementation("org.junit.platform:junit-platform-suite-api")
		testImplementation("org.mockito:mockito-core")
		testImplementation("org.mockito:mockito-junit-jupiter")
		testImplementation("io.mockk:mockk")
		testImplementation("org.assertj:assertj-core")
		// Pull in the latest JUnit 5 Launcher API to ensure proper support in IDEs.
		testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
		testRuntimeOnly("org.junit.platform:junit-platform-launcher")
		testRuntimeOnly("org.junit.platform:junit-platform-suite-engine")
		testRuntimeOnly("org.apache.logging.log4j:log4j-core")
		testRuntimeOnly("org.apache.logging.log4j:log4j-jul")
		testRuntimeOnly("org.apache.logging.log4j:log4j-slf4j2-impl")
		// JSR-305 only used for non-required meta-annotations
		compileOnly("com.google.code.findbugs:jsr305")
		testCompileOnly("com.google.code.findbugs:jsr305")
	}

	ext.javadocLinks = [
			"https://docs.oracle.com/en/java/javase/17/docs/api/",
			"https://jakarta.ee/specifications/platform/9/apidocs/",
			"https://docs.jboss.org/hibernate/orm/5.6/javadocs/",
			"https://eclipse.dev/aspectj/doc/released/aspectj5rt-api",
			"https://www.quartz-scheduler.org/api/2.3.0/",
			"https://fasterxml.github.io/jackson-core/javadoc/2.14/",
			"https://fasterxml.github.io/jackson-databind/javadoc/2.14/",
			"https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.14/",
			"https://hc.apache.org/httpcomponents-client-5.2.x/current/httpclient5/apidocs/",
			"https://projectreactor.io/docs/test/release/api/",
			"https://junit.org/junit4/javadoc/4.13.2/",
			// TODO Uncomment link to JUnit 5 docs once we execute Gradle with Java 18+.
			// See https://github.com/spring-projects/spring-framework/issues/27497
			//
			// "https://junit.org/junit5/docs/5.10.2/api/",
			"https://www.reactive-streams.org/reactive-streams-1.0.3-javadoc/",
			//"https://javadoc.io/static/io.rsocket/rsocket-core/1.1.1/",
			"https://r2dbc.io/spec/1.0.0.RELEASE/api/",
			// Previously there could be a split-package issue between JSR250 and JSR305 javax.annotation packages,
			// but since 6.0 JSR 250 annotations such as @Resource and @PostConstruct have been replaced by their
			// JakartaEE equivalents in the jakarta.annotation package.
			//"https://www.javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/"
	] as String[]
}

configure(moduleProjects) { project ->
	apply from: "${rootDir}/gradle/spring-module.gradle"
}
